package com.lbj.mall.gateway.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;

import java.util.ArrayList;
import java.util.Collections;

/**
 * 配置类，允许所有的跨域请求
 */
@Configuration
public class AppCorsConfig {

    /**
     * 我们只要将CorsWebFilter注册到容器中就可以满足所有的跨域请求
     * 1.为什么在网关这里定义跨域请求？因为所有的请求都会直接转发到网关，所以在网关统一写即可
     * 2.CorsWebFilter是Spring的过滤器，这样会为每个请求都进行过滤，就不需要我们在每个请求中都写允许跨域
     *
     * 注意这里配置了跨域，但是renren-fast项目也配置了跨域
     *  - 这个就导致了请求头参数中会有重复的配置，解决办法就是注释掉renren-fast配置的跨域请求
     */
    @Bean
    public CorsWebFilter corsWebFilter() {
        // 记住引入的包是：reactive，响应式编程
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        // 允许携带Cookie跨域
        config.setAllowCredentials(true);
        // 允许所有请求头跨域
        config.setAllowedHeaders(new ArrayList<>(Collections.singleton("*")));
        // 允许所有方法类型跨域；get/post...
        config.setAllowedMethods(new ArrayList<>(Collections.singleton("*")));
        // 允许所有请求来源跨域
        config.setAllowedOrigins(new ArrayList<>(Collections.singleton("*")));
        // /** 代表所有的请求
        source.registerCorsConfiguration("/**",config);
        return new CorsWebFilter(source);
    }

}
